﻿package aidn.animation.controller 
{
	import aidn.animation.text.Text;
	import aidn.animation.text.TextMc;
	import aidn.animation.utils.Utils;
	import flash.display.*;
	import flash.events.*;
	import flash.geom.Point;
	import flash.utils.*;
	
	
	public class TextMcManager extends Sprite
	{
		// [Methods]
		// 
		// TextMcManager( pts    :/*Point*/Array  = null, tts :/*Number*/Array = null,
		//				  txList :/*String*/Array = null, times :/*Number*/Array = null ) 
		// setPts ( pts :/*Point*/Array = null ) 
		// addPts ( pts :/*Point*/Array ) 
		// setTts ( tts :/*Number*/Array = null )
		// addTts ( tts :/*Number*/Array ) 
		// setClass ( classes :/*Class*/Array )
		// addClass ( classes :/*Class*/Array )
		// 
		// setTxlist ( txList :/*String*/Array = null )
		// addTxlist ( txList :/*String*/Array ) 
		// setTimes ( times :/*Number*/Array = null )
		// addTimes ( times :/*Number*/Array )
		// setFontSizes ( fs :/*Number*/Array )
		// addFontSizes ( fs :/*Number*/Array )
		// 
		// start ( rotPer :Number = 1.0, scaleSize :Number = 0.01 )
		// 
		// setTextFormat ( font :String, color :int = 0, letterSpacing :int = 1 )
		// setTarget ( target :DisplayObjectContainer )
		
		
		private var _pts    :/*Point*/Array;	// 位置
		private var _tts    :/*Number*/Array;	// 表示開始時間
		private var _txList :/*String*/Array;	// テキスト
		
		private var _times  :/*Numbe*/Array;	// 表示されている時間
		
		private var ClassList :/*Class*/Array;
		
		
		private var _now :int;				// 今のカウント
		private var _startTime :uint;		// 開始時刻
		
		private var _target :DisplayObjectContainer;
		
		// FONT 設定
		private var _font		:String;
		private var _color		:int;
		private var _fontSizes	:/*Number*/Array;
		private var _lspace		:int;
		
		
		private var _time :uint = 0;	// 現在時間
		
		private var _rotPer :Number;	// 回転する速度の割合　デフォルトは 1.0
		private var _scale  :Number;	// スケール
		
		
		/**
		 * 
		 * @param	pts		表示位置(Point)配列。
		 * @param	tts		時間配列。
		 * @param	txList	テキスト配列。
		 * @param	times	持続時間配列。
		 */
		public function TextMcManager ( pts    :/*Point*/Array  = null, tts :/*Number*/Array = null,
									    txList :/*String*/Array = null, times :/*Number*/Array = null ) 
		{
			setPts( pts );
			setTts( tts );
			setTxlist( txList );
			setTimes( times );
			
			setFont( Text.MEIRYO );
			setFontSizes([]);
		}
		
		// ------------------------------------------------------------
		/**
		 * 位置(Point)配列をセットします。
		 * @param	pts
		 */
		public function setPts ( pts :/*Point*/Array = null ) :void 
		{
			if ( pts )
			{
				if ( pts[0] is Point )	_pts = pts;
				else					_pts = Utils.numToPts( pts );
			}
		}
		/**
		 * 位置(Point)配列を追加します。
		 * @param	pts
		 */
		public function addPts ( pts :/*Point*/Array ) :void 
		{
			if ( pts[0] is Point )	_pts = _pts.concat( pts );
			else					_pts = _pts.concat( Utils.numToPts( pts ) );
		}
		
		/**
		 * 時間(単位:ms)配列をセットします。
		 * @param	tts
		 */
		public function setTts ( tts :/*Number*/Array = null ) :void 
		{
			if ( tts )	_tts = tts;
		}
		/**
		 * 時間(単位:ms)配列を追加します。
		 * @param	tts
		 */
		public function addTts ( tts :/*Number*/Array ) :void 
		{
			_tts = _tts.concat( tts );
		}
		
		/**
		 * クラス(MovieClip)配列をセットします。
		 * @param	classes
		 */
		public function setClass ( classes :/*Class*/Array ) :void
		{
			var len :uint = classes.length;
			
			ClassList = [];
			for ( var i :int = 0; i < len; i ++ )
				ClassList.push( classes[i] );
		}
		/**
		 * クラス(MovieClip)配列を追加します。
		 * @param	classes
		 */
		public function addClass ( classes :/*Class*/Array ) :void
		{
			var len :uint = classes.length;
			
			if ( ! ClassList ) ClassList = [];
			
			for ( var i :int = 0; i < len; i ++ )
				ClassList.push( classes[i] );
		}
		
		
		/**
		 * テキスト配列をセットします。
		 * @param	txList
		 */
		public function setTxlist ( txList :/*String*/Array = null ) :void 
		{
			if ( txList )	_txList = txList;
		}
		/**
		 * テキスト配列を追加します。
		 * @param	txList
		 */
		public function addTxlist ( txList :/*String*/Array ) :void 
		{
			_txList = _txList.concat( txList );
		}
		
		/**
		 * 表示(持続)時間配列をセットします。
		 * @param	times
		 */
		public function setTimes ( times :/*Number*/Array = null, defTime :Number = 1.5 ) :void 
		{
			_times = [];
			if ( times )	_times = times;
			
			// default
			for ( var i :int = _times.length; i < _tts.length; i ++ )	_times[i] = defTime;
		}
		/**
		 * 表示(持続)時間配列を追加します。
		 * @param	times
		 */
		public function addTimes ( times :/*Number*/Array ) :void 
		{
			_times = _times.concat( times );
		}
		
		/**
		 * フォントサイズ配列をセットします。
		 * @param	fs
		 */
		public function setFontSizes ( fs :/*Number*/Array, defSize :int = 32 ) :void
		{
			_fontSizes = fs;
			
			for ( var i :int = fs.length; i < _tts.length; i ++ ) _fontSizes[i] = defSize;
		}
		/**
		 * フォントサイズ配列を追加します。
		 * @param	fs
		 */
		public function addFontSizes ( fs :/*Number*/Array ) :void
		{
			_fontSizes = _fontSizes.concat( fs );
		}
		// ------------------------------------------------------------
		
		/**
		 * 開始します。
		 * @param	rotPer		テキストの回転具合。		
		 * @param	scaleSize	ズームアウトしていく割合。
		 */
		public function start ( rotPer :Number = 1.0, scaleSize :Number = 0.01 ) :void
		{
			_now = 0;
			_startTime = getTimer();
			
			_rotPer = rotPer;
			_scale  = scaleSize;
			
			var i :int;
			for ( i = _times.length; i < _tts.length; i ++ )		_times[i] = 1.5;
			for ( i = _fontSizes.length; i < _tts.length; i ++ )	_fontSizes[i] = DEF_SIZE;
			
			
			_target.removeEventListener( Event.ENTER_FRAME, _enterFrame );
			   _target.addEventListener( Event.ENTER_FRAME, _enterFrame );
			
			// ------------------------------------- trace
			trace( "pts len:", _pts.length );
			trace( "tts len:", _tts.length );
			trace( "txllist len:", _txList.length );
			trace( "times len:", _times.length );
		}
		
		
		/**
		 * addChild する対象をセットします。
		 * @param	target
		 */
		public function setTarget ( target :DisplayObjectContainer ) :void
		{
			_target = target;
		}
		/**
		 * テキストフォーマットまわりをセットします。
		 * @param	font			フォント。
		 * @param	color			色。
		 * @param	letterSpacing	文字間。
		 */
		public function setTextFormat ( font :String, color :int = 0, letterSpacing :int = 1 ) :void
		{
			_font   = font;
			_color  = color;
			_lspace = letterSpacing;
		}
		
		// ------------------------------------------------------------
		
		private function _enterFrame ( evt :Event ) :void
		{
			var i :int;
			var px :int, py :int;
			
			if ( _now < _tts.length )
			{
				_time = getTimer() - _startTime;
				////_time = _target.currentFrame / 3 * 100;
				
				
				// 時間が上回ったら、
				if ( _tts[_now] < _time )
				{
					px = _pts[_now].x;
					py = _pts[_now].y;
					
					var txmc :TextMc = new TextMc( px, py, 1.5 );
					
					txmc.setText( _txList[_now], _font, _color, _fontSizes[_now], _lspace );
					txmc.motionStart( _times[_now], _times[_now]/3 + 0.1, 20 );
					txmc.rotationStart( Utils.rand(-0.6, 0.6) * _rotPer, Utils.rand(-0.6, 0.6) * _rotPer, 0, - _scale );
					
					// addChild
					if ( _target )	_target.addChild( txmc );
					else					addChild( txmc );
					
					
					if ( ClassList )
					{
						var r :int = Math.floor(Math.random() * ClassList.length);
						var c :MovieClip = new ClassList[r]() as MovieClip;
						
						txmc.addChild( c );
					}
					
					_now ++;
				}
			}
			else	_target.removeEventListener( Event.ENTER_FRAME, _enterFrame );
		}
		
		public function get time():uint { return _time; }
	}
}